# ========= 算术运算符 ========= 幂的优先级最高
print('# ========= 算术运算符 ========= 幂的优先级最高')
print('加', '10 + 5 =', 10 + 5)
print('减', '10 - 5 =', 10 - 5)
print('乘', '10 * 5 =', 10 * 5)
print('除', '10 / 3 =', 10 / 5)
print('取整数', '10 // 3 =', 10 // 3)
print('取余数', '10 % 5 =', 10 % 5)
print('幂', '10 ** 5 =', 10 ** 5)

# ========= 赋值运算符 =========
print('# ========= 赋值运算符 =========')
print()
num = 10  # 定义一个num变量
print(num)
num += 10  # 等价于 num = num + 10
print(num)
num -= 10  # 等价于 num = num - 10
print(num)
num *= 10  # 等价于 num = num * 10
print(num)
num /= 10  # 等价于 num = num / 10
print(num)
num //= 10  # 等价于 num = num // 10
print(num)
num %= 10  # 等价于 num = num % 10
print(num)
num **= 10  # 等价于 num = num ** 10
print(num)

# ========= 比较运算符 =========
print()
print('# ========= 比较运算符 =========', end='\n\n')
print('10 == 5', 10 == 5)
print('10 != 5', 10 != 5)
print('10 > 5', 10 > 5)
print('10 >= 5', 10 >= 5)
print('10 < 5', 10 <= 5)
print('10 <= 5', 10 <= 5)
print('10 == 10.0', 10 == 10.00)  # 整数和浮点数的比较
print('True == False', True == False)  # 布尔类型的比较
print('hello < hi', 'hello' < 'hi')  # 字符串的比较，比较的是 ascii 码值
print('获取ascii码值', ord('a'), ord('A'))

# ========= 逻辑运算符 =========
print()
print('# ========= 逻辑运算符 ========= 优先级 not > and > or')
print('and 与，x and y，若x为False返回x的值，否则返回y的值')
print('or  或，x or y，若x为True返回x的值，否则返回y的值')
print('not 非，not x，若x为True返回False，若x为False返回True')
print('and 与 必须都是true,才是true', '   10 > 5 and True运算结果', 10 > 5 and True)
print('and 短路运算-字符串', 'hello' and 'hi')  # 因为 hello 为True 因此表达式是否成立取决于 hi，因此为返回 hi
print('and 短路运算-字符串', 'hello' and 'hi' and 123)  # 因为 hello和hi为True 因此表达式是否成立取决于123，因此为返回 123
print('and 短路运算-空字符', '' and 'hi')  # 因为 空字符'' 为 False ，因此返回False
print('and 短路运算-False', False and 'hi')  # 因为 False 为 False ，因此返回False
print('and 短路运算-0', 0 and 1)  # 因为 0 为 False ，因此返回False
print('or 或 只要有一个为true就是true', True or False)
print('or 或 只要有一个为true就是true', False or True)
print('or 或 只要有一个为true就是true', False or False)
print('or 短路运算，只要遇到第一个为True的就返回，若没遇到则返回最后一个', False or 3 > 5 or 'is true')
print('or 短路运算，只要遇到第一个为True的就返回，若没遇到则返回最后一个', False or 0 or 'is true')
print('or 短路运算，只要遇到第一个为True的就返回，若没遇到则返回最后一个', False or 1 or 'is true')
print('or 短路运算，只要遇到第一个为True的就返回，若没遇到则返回最后一个', False or '' or 'is true')
print('or 短路运算，只要遇到第一个为True的就返回，若没遇到则返回最后一个', False or '' or 'is true' or 'is ok')
print('not 非, not的结果只能是True或者False', not False)
print('not 非', not True, not 1, not 0, not '', not 'abc')
# ========= 位算符 =========
print()
print('# ========= 位算符（略） ========= ')

# ========= 成员运算符 =========
print()
print('# ========= 成员运算符 ========= ')
print('in -> 判断ll是否在hello中', 'll' in 'hello')
print('in -> 判断123是否在序列中', 123 in (1, 45, 123, 90))
print('not in -> 判断ll是否不在hello中', 'll' not in 'hello')
print('not in -> 判断ll是否不在hello中', 'll' not in 'hello')

# ========= 身份运算符 =========
print()
print('# ========= 身份运算符 ========= ')
a = 1
b = 1
print('is -> 判断两个标识符是否引用同一个对象，是的话返回True，否则返回False', a is b)
print('is not -> 判断两个标识符是否不是引用同一个对象，是的话返回True，否则返回False', a is not b)
print('id() 获取对象在内存中的地址', 'id(a)=', id(a), ' id(b)=', id(b))
